home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / snmp_ifaces.nasl < prev    next >
Text File  |  2005-01-14  |  6KB  |  246 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7.  
  8. if(description)
  9. {
  10.  script_id(10551);
  11.  script_version ("$Revision: 1.12 $");
  12.  
  13.  name["english"] = "Obtain network interfaces list via SNMP";
  14.  name["francais"] = "Enumeration des interfaces rΘseau par SNMP";
  15.  
  16.  script_name(english:name["english"],
  17.           francais:name["francais"]);
  18.  
  19.  desc["english"] = "
  20. This script uses SNMP to obtain the list of
  21. the network interfaces that are installed on the remote host.
  22.  
  23. Risk factor : Low";
  24.  
  25.  desc["francais"] = "
  26. Ce script utilise SNMP pour obtenir la liste des
  27. interfaces rΘseau qui sont installΘes sur la machine distante";
  28.  
  29.  script_description(english:desc["english"],
  30.              francais:desc["francais"]);
  31.  
  32.  summary["english"] = "Enumerates processes via SNMP";
  33.  summary["francais"] = "Enumeration des processus par SNMP";
  34.  script_summary(english:summary["english"],
  35.          francais:summary["francais"]);
  36.  
  37.  script_category(ACT_GATHER_INFO);
  38.  
  39.  script_copyright(english:"This script is Copyright (C) 2000 Renaud Deraison");
  40.  family["english"] = "SNMP";
  41.  script_family(english:family["english"]);
  42.  
  43.  script_dependencies("snmp_default_communities.nasl");
  44.  script_require_keys("SNMP/community");
  45.  exit(0);
  46. }
  47.  
  48.  
  49.  
  50. #
  51. # Solaris comes with a badly configured snmpd which
  52. # always reply with the same value. We make sure the answers
  53. # we receive are not in the list of default values usually
  54. # answered...
  55. #
  56. function valid_snmp_value(value)
  57. {
  58.  if("/var/snmp/snmpdx.st" >< value)return(0);
  59.  if("/etc/snmp/conf" >< value)return(0);
  60.  return(1);
  61. }
  62.  
  63. #--------------------------------------------------------------------#
  64. # Forges an SNMP GET NEXT packet                                     #
  65. #--------------------------------------------------------------------#
  66. function get_next(community, id, object)
  67. {
  68.  len = strlen(community);
  69. #display("len : ", len, "\n");
  70.  len = len % 256;
  71.  
  72.  tot_len = 4 + strlen(community) + 12 + strlen(object) + 4;
  73. # display(hex(tot_len), "\n");
  74.  _r = raw_string(0x30, tot_len, 0x02, 0x01, 0x00, 0x04, len);
  75.  o_len = strlen(object) + 2;
  76.  
  77.  a_len = 13 + strlen(object);
  78.  _r = _r + community + raw_string( 0xA1,
  79.     a_len, 0x02, 0x01, id,   0x02, 0x01, 0x00, 0x02,
  80.     0x01, 0x00, 0x30,o_len) + object + raw_string(0x05, 0x00);
  81. # display("len : ", strlen(_r), "\n");
  82.  return(_r);
  83. }
  84.  
  85. #---------------------------------------------------------------------#
  86. # Extracts the object from a reply                                    #
  87. #---------------------------------------------------------------------#
  88. function extract_obj(data)
  89. {
  90.  if(ord(data[2]) == 2)
  91.   {
  92.   cmty_len = ord(data[6]);
  93.   off = 18 + cmty_len;
  94.  }
  95.  else
  96.  {
  97.   cmty_len  = ord(data[7]);
  98.  
  99.   off = 20 + cmty_len;
  100.  }
  101.  
  102.  if ( off + 5 > strlen(data)) return NULL;
  103.  
  104.  
  105.  
  106.  len_payload = ord(data[off]);
  107.  _obj = "";
  108.  
  109.  total_len = ord(data[off+5])+6;
  110.  
  111.  if(total_len > strlen(data)) return NULL;
  112.  
  113.  for(i=4;i<total_len;i=i+1)
  114.  {
  115.   _obj = _obj + raw_string(ord(data[off+i]));
  116.  }
  117.  
  118.  _len = strlen(_obj) + 2;
  119. # display(">len : ", _len, "\n");
  120.  _len = _len % 255;
  121.  _obj2 = raw_string(0x30, _len);
  122.  _obj = _obj2 + _obj;
  123.  
  124.  l = strlen(_obj);
  125. # for(i=0;i<l;i=i+1)display(hex(ord(_obj[i])), " ");
  126. # display("\n");
  127.  return(_obj);
  128. }
  129.  
  130.  
  131. #---------------------------------------------------------------------#
  132. # Extracts the data from a reply                                      #
  133. #---------------------------------------------------------------------#
  134. function extract_data(data)
  135. {
  136.   if(ord(data[2]) == 2)
  137.   {
  138.   cmty_len = ord(data[6]);
  139.   off1 = 18 + cmty_len;
  140.   off = 39 + cmty_len;
  141.  }
  142.  else
  143.  {
  144.   cmty_len  = ord(data[7]);
  145.   off1 = 20 + cmty_len;
  146.   off = 41 + cmty_len;
  147.  }
  148.  
  149.  if(off1+5 > strlen(data)) return NULL;
  150.  
  151.  off = 18 + ord(data[off1+5])+ 7 + cmty_len;
  152.  
  153.  if( off > strlen(data)) return NULL;
  154.  
  155. # display("OFF = ", off, "\n");
  156.  _len = ord(data[off]);
  157.  _data = ""; 
  158.  
  159.  
  160.  #display("OFF :" , off, " _LEN : ", hex(_len), "\n");
  161.  #_len =  ord(data[off+18+_len]);
  162.  
  163.  if( _len > strlen(data)) return NULL;
  164.  
  165.  
  166.  for(i=0;i<_len;i=i+1){
  167.      n = ord(data[off+i+1]);
  168.     if((n > 0x00) &&
  169.        !(n == 0x5C))
  170.      _data = _data + raw_string(ord(data[off+i+1]));
  171.     }
  172.  #display("data : ", _data, "\n");
  173.  return(_data);
  174. }
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182. community = get_kb_item("SNMP/community");
  183. if(!community)exit(0);
  184.  
  185. port = get_kb_item("SNMP/port");
  186. if(!port) port = 161;
  187.  
  188. ifaces = "";
  189.  
  190. soc = open_sock_udp(port);
  191.  
  192. first = raw_string(0x30, 0x82, 0x00, 
  193.            0x0D, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x02, 0x01,
  194.            0x02, 0x02, 0x01, 0x02);
  195.           
  196. id = 2;
  197. req = get_next(id:id, community:community, object:first);
  198.  
  199. send(socket:soc, data:req);
  200. r = recv(socket:soc, length:1025);
  201. if(strlen(r) < 48)exit(0);
  202.  
  203. nxt = extract_obj(data:r);
  204. data = extract_data(data:r);
  205. #display(data, "\n");
  206. if(valid_snmp_value(value:data))
  207.  ifaces = string(ifaces, ". ", data, "\n");
  208.  
  209.  
  210.  
  211. for(z=1;z<255;z=z+1)
  212. {
  213. req = get_next(id:id+z, community:community, object:nxt);
  214. send(socket:soc, data:req);
  215. r = recv(socket:soc, length:1025);
  216. #display("PKT LEN : ", strlen(r), "\n");
  217. if(strlen(r) < 48)
  218.  {
  219.   z = 256;
  220.  }
  221. else
  222.  {
  223.  nxt = extract_obj(data:r);
  224.  data = extract_data(data:r);
  225.  
  226.  if(strlen(data))
  227.   {
  228.   if(valid_snmp_value(value:data))
  229.     ifaces = string(ifaces, ". ", data, "\n");
  230.   }
  231.  }
  232. }
  233.  
  234. if(strlen(ifaces) > 3)
  235. {
  236.  report = string(
  237. "It was possible to obtain the list of network interfaces of the\n",
  238. "remote host via SNMP : \n\n", ifaces, "\n",
  239. "An attacker may use this information to gain more knowledge about\n",
  240. "the target host.\n",
  241. "Solution : disable the SNMP service on the remote host if you do not\n",
  242. "           use it, or filter incoming UDP packets going to this port\n",
  243. "Risk factor : Low");
  244.  security_warning(protocol:"udp", port:port, data:report);
  245. }
  246.